package cc.owoo.godpen.reflect;

import java.util.HashMap;

/**
 * 对象反射创建器，如果需要创建的对象被多次使用，请使用这个类创建
 * Created by 摸鱼
 * 2022/05/27 下午 06:33
 */
public class ObjectReflectBuild {
    private static final HashMap<Class<?>, ObjectReflect<?>> cache = new HashMap<>();// 被创建过的对象

    /**
     * 创建一个反射对象
     *
     * @param type 需要创建的类
     * @param <T>  类型
     * @return 对象反射
     */
    public static <T> ObjectReflect<T> create(Class<T> type) {
        if (type == null)
            throw new NullPointerException("type不能为空");
        synchronized (ReflectLock.lock) {
            ObjectReflect<?> objectReflect = cache.get(type);
            if (objectReflect != null)
                try {
                    return (ObjectReflect<T>) objectReflect;
                } catch (Exception ignored) {
                }
            ObjectReflect<T> reflect = new ObjectReflect<>(type, false);
            cache.put(type, reflect);
            reflect.build();
            return reflect;
        }
    }

    /**
     * 清空缓存，但不建议这么干，构建器会缓存已经构建过的反射对象，每一个对象对应一个class类，因此并不会消耗很多内存
     */
    public void clear() {
        synchronized (cache) {
            cache.clear();
        }
    }
}

